/*
 * Estado           Autor              Metodo
 *  OK          Maur i                  iniciarSesion
 *  OK         MAuri                    listarPaises
 *  OK         MAuri                    listarProvincias
 *  OK         MAuri                    guardarCliente
 *  Sin P         MAuri                    recordarContrase�a
 *  Sin P         MAuri                   modificarCliente
 */

package gestores.pagina;

import dal.ClienteDAL;

import excepciones.AvwException;

import java.util.ArrayList;
import java.util.HashMap;

import java.util.logging.Level;
import java.util.logging.Logger;

import negocio.Cliente;

import negocio.Ubicacion;

import util.Email;
import util.Recurso;
import util.Utiles;

public class GestorCliente {
    
    static final Logger logger = Utiles.iniciarLogger("GestorCliente", false);
    
    public GestorCliente() {
    }
    
    
    /**
     * @param email
     * @param contrasenia
     * @return hashMap Con el "cliNombre" nombre y "cliCodigo" codigo del cliente
     * @throws AvwException
     */
    public static HashMap iniciarSesion(String email,
            String contrasenia) throws AvwException, NullPointerException {
        Cliente c = new Cliente();
        HashMap hashMap = new HashMap();
        
        c.setCliEmail(email);
        
        logger.info("Obtengo el cliente.");
        c = ClienteDAL.obtenerClientePorEmail(c);
        
        logger.info("Valido la contrase�a");
        c.validarContrasenia(contrasenia);
        logger.info("Contrase�a valida");
        hashMap.put("cliCodigo", c.getCliCodigo());
        hashMap.put("cliNombre", c.getCliNombre());
        
        return hashMap;
        
    }
    
    /**
     * @return ArrayList<HashMap> de los paises existente en el sistema con los siguientes datos:
     * "ubiCodigo" codigo. "ubiNombre" nombre.
     */
    public static ArrayList<HashMap> listarPaises()throws NullPointerException {
        
        ArrayList<HashMap> arr = new ArrayList<HashMap>();
        
        try {
            ArrayList<Ubicacion> paises = ClienteDAL.listarPaises();
            
            for (Ubicacion u: paises) {
                HashMap hashMap = new HashMap();
                hashMap.put("ubiCodigo", u.getUbiCodigo());
                hashMap.put("ubiNombre", u.getUbiNombre());
                arr.add(hashMap);
            }
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        
        return arr;
    }
    
    
    /**
     * @return ArrayList<HashMap> de los Provincias existente en el sistema con los siguientes datos:
     * "ubiCodigo" codigo. "ubiNombre" nombre.
     */
    public static ArrayList<HashMap> listarProvincias() throws NullPointerException{
        
        ArrayList<HashMap> arr = new ArrayList<HashMap>();
        
        try {
            ArrayList<Ubicacion> paises = ClienteDAL.listarProvincias();
            
            for (Ubicacion u: paises) {
                HashMap hashMap = new HashMap();
                hashMap.put("ubiCodigo", u.getUbiCodigo());
                hashMap.put("ubiNombre", u.getUbiNombre());
                arr.add(hashMap);
            }
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        
        return arr;
    }
    
    
    /**
     * @param proCodigo
     * @return ArrayList<HashMap> de los Localidades existente en el sistema con los siguientes datos:
     * "ubiCodigo" codigo. "ubiNombre" nombre.
     */
    public static ArrayList<HashMap> listarLocalidades(String proCodigo)throws NullPointerException {
        
        ArrayList<HashMap> arr = new ArrayList<HashMap>();
        
        try {
            ArrayList<Ubicacion> localidades =
                    ClienteDAL.listarLocalidades(new Ubicacion(proCodigo));
            
            for (Ubicacion u: localidades) {
                HashMap hashMap = new HashMap();
                hashMap.put("ubiCodigo", u.getUbiCodigo());
                hashMap.put("ubiNombre", u.getUbiNombre());
                arr.add(hashMap);
            }
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        
        return arr;
    }
    
    /*
    Return: false si el email ya existe en la base, true en caso contrario y si se guarda el cliente
    Paramtros: los siguientes datos nombre, razon social,
    direccion, piso, departamento, pais, provincia,
    localidad, codigo postal, tipo iva, cuit, e-mail y contrasenia.
     */
    
    public static boolean insertarCliente(String cliNombre, String cliRazonSocial,
            String cliDireccion, String cliPiso,
            String cliDepartamento,
            String cliCodigoPais,
            String cliCodigoProvincia,
            String cliCodigoLocalidad,
            String cliCodigoPostal,
            String cliTipoIva, String cliCuit,
            String cliEmail, String cliContrasenia) throws AvwException {
        
        Cliente cliente = new Cliente();
        
        //Verifico si no existe otro cliente con el mismo email registrado
        cliente.setCliEmail(cliEmail);
        try {
            logger.info("Verifico si no existe otro cliente con el mismo email registrado");
            ClienteDAL.obtenerClientePorEmail(cliente);
            logger.info("El email ya esta registrado");
            return false;
        } catch (AvwException e) {
            logger.info("El cliente no esta registrado");
            cliente.setCliNombre(cliNombre);
            cliente.setCliRazonSocial(cliRazonSocial);
            cliente.setCliDireccion(cliDireccion);
            cliente.setCliPiso(cliPiso);
            cliente.setCliDepartamento(cliDepartamento);
            cliente.setCliPais(new Ubicacion(cliCodigoPais));
            cliente.setCliProvincia(new Ubicacion(cliCodigoProvincia));
            cliente.setCliLocalidad(new Ubicacion(cliCodigoLocalidad));
            cliente.setCliCodigoPostal(cliCodigoPostal);
            cliente.setCliTipoIva(cliTipoIva);
            cliente.setCliCuit(cliCuit);
            cliente.setCliEmail(cliEmail);
            cliente.setCliContrasenia(cliContrasenia);
            logger.info("Inserto cliente");
            ClienteDAL.insertarCliente(cliente);
            logger.info("Cliente insertado");
            return true;
        }
    }
    
    /**
     * @param email
     * @return true en el caso de que existe el usuario y false en caso contrario.
     */
    public static boolean recordarContrasenia(String email) throws AvwException {
        Cliente cliente = new Cliente();
        String titulo;
        StringBuilder html = new StringBuilder();
        String mail;
        String nombre;
        
        Recurso recurso = new Recurso("mail.properties");
        cliente.setCliEmail(email);
        try {

            cliente = ClienteDAL.obtenerClientePorEmail(cliente);
            mail = recurso.obtenerPropiedad("mailDefault");
            nombre = recurso.obtenerPropiedad("mailNombreDefault");
            titulo = recurso.obtenerPropiedad("recordarContraseniaTitulo");
        
            html.append("<table cellpadding='0' cellspacing='0'>");
            html.append("<tr>");
            html.append("   <td><b>Hola ");
            html.append(cliente.getCliNombre());
            html.append("!!</b></td>");
            html.append("</tr>");
            html.append("<tr>");
            html.append("<td>Hemos recibido la solicitud para recuperar tu contrase&ntilde;a.</td>            ");
            html.append("</tr>");
            html.append("<tr>");
            html.append("<td>Su contrase&ntilde;a de acceso: ");
            html.append(cliente.getCliContrasenia());
            html.append("</td></tr>");
            html.append("</table>");
            html.append("<div align='center'>");
            html.append("<a href= 'http://www.empiretech.com.ar/index'> .:empiretech:. </a>");
            html.append("</div>");

            Email.enviarEmailHTML(mail, email, nombre,
                    cliente.getCliNombre(), titulo,"",
                    html.toString());
            return true;
           }catch (AvwException e){ 
                return false;
            }
        
    }
    
    
    /*
     * Return: no aplica.
Paramtros: los siguientes datos codigo,
nombre, razon social, direccion, piso,
departamento, pais, provincia, localidad, codigo postal, tipo iva, cuit, e-mail y contrasenia.
     *
     */
    
    public static void modificarCliente(String cliNombre,
            String cliRazonSocial,
            String cliDireccion, String cliPiso,
            String cliDepartamento, String cliPais,
            String cliProvincia,
            String cliLocalidad,
            String cliCodigoPostal,
            String cliTipoIva, String cliCuit,
            String cliEmail,
            String cliContrasenia) {
        Cliente cliente = new Cliente();
        try {
            cliente.setCliEmail(cliEmail);
            cliente = ClienteDAL.obtenerClientePorEmail(cliente);
            cliente.setCliNombre(cliNombre);
            cliente.setCliRazonSocial(cliRazonSocial);
            cliente.setCliDireccion(cliDireccion);
            cliente.setCliPiso(cliPiso);
            cliente.setCliDepartamento(cliDepartamento);
            cliente.setCliPais(new Ubicacion(cliPais));
            cliente.setCliProvincia(new Ubicacion(cliProvincia));
            cliente.setCliLocalidad(new Ubicacion(cliLocalidad));
            cliente.setCliCodigoPostal(cliCodigoPostal);
            cliente.setCliTipoIva(cliTipoIva);
            cliente.setCliCuit(cliCuit);
            cliente.setCliEmail(cliEmail);
            cliente.setCliContrasenia(cliContrasenia);
            
            ClienteDAL.modificarCliente(cliente);
            
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
    }
}
